package com.srx.user.controller;

import com.srx.openfeign.utils.ResultUtil;
import com.srx.user.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.IOException;

/**
 * 用户控制器类
 * <p>处理与用户相关的HTTP请求。该类定义了一系列RESTFUL API接口，用于处理用户的登录、密码更新、信息查询等操作。包含的方法有发送邮件验证码、用户登录、更新密码、获取用户基本信息和头像等。
 * @author 沈汝旭
 * @since 2025-10-18 10:54:05
 * @version 1.0
 */
@RestController
@RequestMapping("/user")
@Tag(name = "用户接口", description = "用户服务相关接口")
public class UserController
{

    /**
     * 用户服务对象
     */
    private final UserService userService;


    /**
     * 构造函数，初始化用户服务对象
     *
     * @param userService 用户服务对象
     */
	@Autowired
	public UserController(UserService userService)
	{
		this.userService = userService;
	}




	/**
	 * 用户登录接口
	 * <p>该接口处理用户登录的HTTP请求，接收用户账户和密码作为参数，调用userService的login方法进行登录验证，并返回登录结果。</p>
	 *
	 * @param account 用户账户，通常为邮箱
	 * @param password 用户密码，明文形式
	 * @return 登录结果，成功时返回生成的Token，登录失败返回null
	 */
	@GetMapping("/login")
	@Operation(summary = "用户登录", description = "根据用户名和密码进行登录")
	@Parameters({
			@Parameter(name = "account", description = "账号", example = "2020214555"),
			@Parameter(name = "password", description = "密码", example = "Zijinyunyou!2580")
	})
	public ResultUtil<String> login(String account, String password)
	{
		String result = userService.login(account, password);
		return ResultUtil.createResult(200, "执行成功", result, result == null ? 0 : 1);
	}


    /**
     * 发送电子邮件验证码接口
     * <p>该接口处理发送电子邮件验证码的HTTP请求，接收用户邮箱作为参数，调用userService的sendEmail方法进行验证码发送，并返回发送结果。</p>
     *
     * @param email 用户邮箱，用于发送验证码
     * @return 发送结果，成功时返回true，失败时返回false
     */
    @PostMapping("/email-code")
    @Operation(summary = "发送电子邮件", description = "发送电子邮件验证码")
    @Parameter(name = "email", description = "邮箱", example = "2017142276@qq.com")
    public ResultUtil<Boolean> sendEmail(String email)
    {
        return ResultUtil.createResult(200, "执行成功", userService.sendEmail(email), 0);
    }


    /**
     * 更新密码接口
     * <p>该接口处理更新密码的HTTP请求，接收用户邮箱、验证码和密码作为参数，调用userService的updatePassword方法进行密码更新，并返回更新结果。</p>
     *
     * @param email 用户邮箱，用于验证用户身份
     * @param code 用户验证码，用于验证用户身份
     * @param password 新密码，明文形式
     * @return 更新结果，成功时返回true，失败时返回false
     */
    @PatchMapping("/password")
    @Operation(summary = "更新密码", description = "更新用户密码")
    @Parameters({
			@Parameter(name = "email", description = "邮箱", example = "2017142276@qq.com"),
			@Parameter(name = "code", description = "验证码", example = "123456"),
			@Parameter(name = "password", description = "密码", example = "Zijinyunyou!2580")
	})
    public ResultUtil<Boolean> updatePassword(String email, String code, String password)
    {
        return ResultUtil.createResult(200, "执行成功", userService.updatePassword(email, code, password), 0);
    }


/*	*//**
	 * 获取mysql的所有信息增加到es
	 *//*
    @GetMapping("/MySQLToEs")
    public void mysqlToEs()
    {
        userService.mysqlToEs();
    }






    *//**
     * 获取用户基本信息接口。
     *
     * @param request HTTP请求对象，包含用户ID头信息
     * @return 用户基本信息对象
     *//*
    @GetMapping("/user-info")
    public UserVO getBasicInfo(HttpServletRequest request)
    {
        return userService.getBasicInfo(Integer.parseInt(request.getHeader("userId")));
    }


	*//**
     * 获取用户头像接口。
     *
     * @param request HTTP请求对象，包含用户ID头信息
     * @return 用户头像字节数组
     *//*
    @GetMapping( "/avatar")
    public byte[] getAvatarById(HttpServletRequest request)
    {
        return userService.getAvatarById(Integer.parseInt(request.getHeader("userId"))).getAvatar();
    }


    *//**
     * 根据ID获取用户姓名接口
     * @return 用户名称
     *//*
    @GetMapping("/name")
    public String getNameById(HttpServletRequest request)
    {
		return userService.getNameById(Integer.parseInt(request.getHeader("userId")));
    }


    *//**
     * 处理更新用户头像的HTTP请求接口。
     *
     * @param request 包含用户ID
     * @param avatarImage 新的头像文件，以MultipartFile形式上传
     * @return 操作结果描述，直接返回userService.updateAvatar的执行结果
     * @throws IOException 如果读取文件字节过程中发生I/O错误
     *//*
    @PutMapping("/avatar")
    public String updateAvatar(HttpServletRequest request, MultipartFile avatarImage) throws IOException
    {
        return userService.updateAvatar(Integer.parseInt(request.getHeader("userId")), avatarImage);
    }


    *//**
     * 导出用户信息为 Excel 文件
     * <p>
     * 该方法处理 GET 请求 "/exportUserInfo"，生成 Excel 文件并返回给客户端进行下载。
     *
     * @param response HttpServletResponse 对象，用于设置响应内容类型和输出 Excel 文件
     * @throws IOException 如果在生成或写入 Excel 文件过程中发生 I/O 错误
     *//*
    @GetMapping("/export-user-info")
    public void exportUserInfo(HttpServletRequest request, HttpServletResponse response) throws IOException
    {
        //设置响应内容类型为 Excel（.xlsx）格式
        response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
        //设置响应头，指定浏览器以下载方式处理文件，文件名为“用户信息.xlsx”；
        response.setHeader("Content-Disposition", "attachment");
        //调用 userService.exportUserInfo() 生成 Excel 工作簿；
        Workbook workbook = userService.exportUserInfo(Integer.parseInt(request.getHeader("userId")));
        //将生成的 Excel 写入 HTTP 响应输出流，供前端下载；
        workbook.write(response.getOutputStream());
        //关闭工作簿，释放资源。
        workbook.close();
    }*/

}
